import BaseObject from "../../移动商城改/base/baseObject.js";
import EventProduct from "../event/eventProduct.js";

/**
 * @description 订单类模型
 * @class {OrderModel}
 * @author hhx
 * @date 2024-11-28 11:11
 * @version 0.1.2
 */
export default class OrderModel extends BaseObject {

    /**
     * @description 事件生产者
     * @private
     * @type {EventProduct|*}
     */
    _eventProduct = null

    /**
     * @description 订单类构造函数
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 订单类控制器
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {OrderModel|*} 基础内容单元格控制器 实例
     */
    static instance(props = {}) {
        let instance = new OrderModel(props);
        instance.init(props);
        return instance;
    }

    //=========================== 内部成员 ===============================

    /**
     * @description 获取 事件生产者
     * @member
     * @protected
     * @return {EventProduct} 事件生产者
     */
    get eventProduct() {
        return this._eventProduct;
    }

    /**
     * @description 设置 事件生产者
     * @member
     * @protected
     * @param eventProduct {EventProduct} 事件生产者
     */
    set eventProduct(eventProduct) {
        this._eventProduct = eventProduct;
    }

    //=========================== 成员方法 ===============================

    /**
     * @description 获取 事件生产者
     * @public
     * @return {EventProduct} 事件生产者
     */
    getEventProduct() {
        return this.eventProduct;
    }

    /**
     * @description 设置 事件生产者
     * @public
     * @param newValue {EventProduct} 事件生产者
     */
    setEventProduct(newValue) {
        this.eventProduct = newValue;
    }

    //=========================== 内部属性 ===============================

    /**
     * @description 获取 订单id
     * @property
     * @protected
     * @return {string} 订单id
     */
    get orderId() {
        return this.getValue('orderId');
    }

    /**
     * @description 设置 订单id
     * @property
     * @protected
     * @param value {string} 订单id
     */
    set orderId(value) {
        this.setValue('orderId', value);
    }

    /**
     * @description 获取 用户id
     * @property
     * @protected
     * @return {string} 用户id
     */
    get userId() {
        return this.getValue('userId');
    }

    /**
     * @description 设置 用户id
     * @property
     * @protected
     * @param value {string} 用户id
     */
    set userId(value) {
        this.setValue('userId', value);
    }

    /**
     * @description 获取 订单列表
     * @property
     * @protected
     * @return {Array} 订单列表
     */
    get orderList() {
        return this.getValue('orderList');
    }

    /**
     * @description 设置 订单列表
     * @property
     * @protected
     * @param value {Array} 订单列表
     */
    set orderList(value) {
        this.setValue('orderList', value);
    }

    /**
     * @description 获取 订单总价
     * @property
     * @protected
     * @return {number} 订单总价
     */
    get orderTotalPrice() {
        return this.getValue('orderTotalPrice');
    }

    /**
     * @description 设置 订单总价
     * @property
     * @protected
     * @param value {number} 订单总价
     */
    set orderTotalPrice(value) {
        this.setValue('orderTotalPrice', value);
    }

    /**
     * @description 获取 订单状态
     * @property
     * @protected
     * @return {string} 订单状态
     */
    get orderStatus() {
        return this.getValue('orderStatus');
    }

    /**
     * @description 设置 订单状态
     * @property
     * @protected
     * @param value {string} 订单状态
     */
    set orderStatus(value) {
        this.setValue('orderStatus', value);
    }

    //=========================== 属性方法 ===============================

    /**
     * @description 获取 订单ID
     * @public
     * @returns {string} 订单ID
     */
    getOrderId() {
        return this.orderId;
    }

    /**
     * @description 设置 订单ID
     * @public
     * @param value {string} 订单ID
     */
    setOrderId(value) {
        this.orderId = value;
    }

    /**
     * @description 获取 用户ID
     * @public
     * @returns {string} 用户ID
     */
    getUserId() {
        return this.userId;
    }

    /**
     * @description 设置 用户ID
     * @public
     * @param value {string} 用户ID
     */
    setUserId(value) {
        this.userId = value;
    }

    /**
     * @description 获取 订单列表
     * @public
     * @returns {Array} 订单列表
     */
    getOrderList() {
        return this.orderList;
    }

    /**
     * @description 设置 订单列表
     * @public
     * @param value {Array} 订单列表
     */
    setOrderList(value) {
        this.orderList = value;
    }

    /**
     * @description 获取订单总价格
     * @public
     * @returns {number} 订单总价格
     */
    getOrderTotalPrice() {
        return this.orderTotalPrice;
    }

    /**
     * @description 设置订单总价格
     * @public
     * @param value {number} 订单总价格
     */
    setOrderTotalPrice(value) {
        this.orderTotalPrice = value;
    }

    /**
     * @description 获取订单状态
     * @public
     * @returns {string} 订单状态
     */
    getOrderStatus() {
        return this.orderStatus;
    }

    /**
     * @description 设置订单状态
     * @public
     * @param value {string} 订单状态
     */
    setOrderStatus(value) {
        this.orderStatus = value;
    }

    //=========================== 构建方法 ===============================

    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {
        super.init(props);

        //构建事件生产者
        this.initEventProduct();
    }


    //=========================== 内部方法 ===============================

    /**
     * @description 初始化事件生产者
     * @protected
     */
    initEventProduct() {
        let eventProduct = this.createEventProduct();
        this.setEventProduct(eventProduct)
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建生产者
     * @protected
     */
    createEventProduct() {
        return EventProduct.instance()
    }

    //=========================== 事件订阅 ===============================

    /**
     * @description 订阅订单改变事件
     * @protected
     * @param callback {Function} 回调函数
     */
    subscriberOrderChange(callback) {
        this.eventProduct.subscriberEvent(this, 'orderChange', callback)
    }

    //=========================== 事件触发 ===============================

    /**
     * @description 触发事件
     * @protected
     * @param target {Object} 触发事件的对象
     * @param param {*} 参数
     */
    triggerOrderChange(target, param) {
        this.eventProduct.triggerEvent(target, 'orderChange', param);
    }

    //=========================== 处理函数 ===============================

    //=========================== 接口方法 ===============================

    /**
     * @description 创建订单方法
     * @public
     * @param target {Object} 触发事件对象
     * @param param {*} 参数
     */
    createOrder(target, param) {

        this.setOrderId((+new Date()).toString());
        this.setUserId((+new Date()).toString());

        let {shopCartList, totalPrice} = param
        this.setOrderList(shopCartList);
        this.setOrderTotalPrice(totalPrice);

        //触发事件
        this.triggerOrderChange(target, param);
    }

    /**
     * @description 更新订单状态
     * @public
     * @param state {string} 订单状态
     */
    updateOrderStatus(state) {
        this.setOrderStatus(state);
    }
}

